/**
 * @projectName: com.xiayuanxing.designPattern
 * @className: Client
 * @author: xiayuanxing
 * @description: TODO
 * @date: 2021/12/28 14:23
 * @version: 1.0
 */
public class Client {

    //组合模式的注意事项和细节
    // 1)简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
    // 2)具有较强的扩展性。当我们要更改组合对象时，我们只需要调整内部的层次关系，客户端不用做出任何改动.
    // 3)方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节，容易添加节点或者叶子从而创建出复杂的树形结构
    // 4)需要遍历组织机构，或者处理的对象具有树形结构时,非常适合使用组合模式.
    // 5)要求较高的抽象性，如果节点和叶子有很多差异性的话，比如很多方法和属性都不一样，不适合使用组合模式

    public static void main(String[] args) {
        //1.创建一个大学
        OrganizationComponent university = new University("中国清华大学", "大学备注");

        //2.创建两个学院
        OrganizationComponent college1 = new College("机械学院", "机械备注");
        OrganizationComponent college2 = new College("信息学院", "信息备注");

        //3.在学院下加入三个专业
        college1.add(new Department("机械专业1","专业备注1"));
        college1.add(new Department("机械专业2","专业备注2"));
        college1.add(new Department("机械专业3","专业备注3"));
        college2.add(new Department("信息专业1","信息备注1"));
        college2.add(new Department("信息专业2","信息备注2"));
        college2.add(new Department("信息专业3","信息备注3"));

        //4.将学院加入到学校
        university.add(college1);
        university.add(college2);

        college1.print();
        college2.print();

    }
}
